// 2-1 动态内存

/**
 * 了解动态内存在 C++ 中是如何工作的是成为一名合格的 C++ 程序员必不可少的。C++ 程序中的内存分为两个部分：

    栈：在函数内部声明的所有变量都将占用栈内存。
    堆：这是程序中未使用的内存，在程序运行时可用于动态分配内存。

 * 很多时候，您无法提前预知需要多少内存来存储某个定义变量中的特定信息，所需内存的大小需要在运行时才能确定。

 * 在 C++ 中，您可以使用特殊的运算符为给定类型的变量在运行时分配堆内的内存，这会返回所分配的空间地址。这种运算符即 new 运算符。

 * 如果您不再需要动态分配的内存空间，可以使用 delete 运算符，删除之前由 new 运算符分配的内存。
 *
 * 
 * new 和 delete 运算符
 * 下面是使用 new 运算符来为任意的数据类型动态分配内存的通用语法：
 
        new data-type;

  * 在这里，data-type 可以是包括数组在内的任意内置的数据类型，也可以是包括类或结构在内的用户自定义的任何数据类型。让我们先来看下内置的数据类型。例如，我们可以定义一个指向 double 类型的指针，然后请求内存，该内存在执行时被分配。我们可以按照下面的语句使用 new 运算符来完成这点：
  
        double* pvalue  = NULL; // 初始化为 null 的指针
        pvalue  = new double;   // 为变量请求内存
  
  * 如果自由存储区已被用完，可能无法成功分配内存。所以建议检查 new 运算符是否返回 NULL 指针，并采取以下适当的操作：

        double* pvalue  = NULL;
        if( !(pvalue  = new double ))
        {
          cout << "Error: out of memory." <<endl;
          exit(1);
        
        }
  * malloc() 函数在 C 语言中就出现了，在 C++ 中仍然存在，但建议尽量不要使用 malloc() 函数。new 与 malloc() 函数相比，其主要的优点是，new 不只是分配了内存，它还创建了对象。

  * 在任何时候，当您觉得某个已经动态分配内存的变量不再需要使用时，您可以使用 delete 操作符释放它所占用的内存，如下所示：

      delete pvalue;        // 释放 pvalue 所指向的内存

  * 下面的实例（实例一）中使用了上面的概念，演示了如何使用 new 和 delete 运算符：
*/

#include <iostream>

int main(void){
  double *d = NULL;// 初始化为NULL的指针
  // d = new double;// 为变量请求内存
  d = new double();// 区别是？？
  *d = 3.14159;// 在分配的内存存储值

  std::cout << "d : " << *d << std::endl;

  delete d;// 释放内存
  std::cout << "d : " << *d << std::endl;

  printf("-----------------end--------------\n");
  return 0;
}